
// Object.create();

// let obj = Object.create(null);

// obj.a = 1;
// obj.b = 2;
// console.log(obj); // 无原型属性

// obj = {
//   a: 1,
//   b: 2
// }
// 重新赋值 是由 new Object()构造出来的

// console.log(obj); // 有原型属性

// function Test() {}
// Test.prototype.a = function () {}
// 而不是这样写
// Test.prototype = { // 容易被外面的 Object所影响
//   a: function (){}
// }


// let obj = Object.create({a: 1});

// let obj = Object.create({a: 1}, {
//   b: 2 // 这样写会报错 第二个参数需要是对象
// });

let obj = Object.create({a: 1}, {
  b: {
    // descriptor 描述器
    value: 2,
    // writable: true,
    enumerable: true,
    // configurable: true
  },
  c: {
    value: 3,
    enumerable: true
  }
});

// delete obj.c;
// obj.c = 4;

// console.log(obj);

// for (let k in obj) {
//   console.log(k, obj[k]);
// }

const newObj = Object.assign({}, obj);

// console.log(newObj); // {b: 2} 只有b是可枚举的属性 
// assign不会管源对象里的原型属性，原型属性a不枚举

// newObj.b = 222;
// delete newObj.b; // 不会管 create第二个参数对象里的描述符

// for (let k in newObj) {
//   console.log(k, newObj[k]);
// }

console.log(newObj);

// 实现Object.create

Object.myCreate = function (proto, propertiesObject) {
  function F() {};
  F.prototype = proto;

  return new F();
}

/**
 * Objcet.create(proto，[propertiesObject])
 * proto: 新创建对象的原型对象
 * [propertiesObject]: 可选。需要传入一个对象,新创建的对象添加指定的属性值和对应的属性描述符
 * 创建一个新对象，使用现有的对象来提供新创建的对象的__proto__
 * 
 */




